package ${baseMapper.packageName};

import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;

/**
 * Mapper的基础定义
 *
 * @author MyBatisX Generator
 */
public interface ${baseMapper.fileName + '<T>'} {
    // region MyBatisX Generator
    /**
     * 保存记录，忽略id,createdAt,updatedAt等字段
     *
     * @param record 待处理的数据
     * @return 更新成功记录数
     * @author MyBatisX Generator
     */
    int save(@Param("record") T record);

    /**
     * 保存记录，仅保留提供了值的字段
     *
     * @param record 待处理的数据
     * @return 更新成功记录数
     * @author MyBatisX Generator
     */
    int saveSelective(@Param("record") T record);

    /**
     * 保存记录，如果存在主键、唯一键冲突，则进行数据更新
     *
     * @param record 待处理的数据
     * @return 更新成功记录数
     * @author MyBatisX Generator
     */
    int saveOnDuplicateKey(@Param("record") T record);

    /**
     * 批量插入数据
     *
     * @param records 待插入的数据集合
     * @return 插入成功的记录数
     * @author MyBatisX Generator
     */
    int batchSave(@Param("records") ${'Collection<T>'} records);

    /**
     * 根据record中提供的主键id进行数据更新
     *
     * @param record 待更新的数据
     * @return 更新成功的数量
     * @author MyBatisX Generator
     */
    int update(@Param("record") T record);

    /**
     * 根据主键更新非主键字段
     *
     * @param record 待处理的数据
     * @return 更新成功记录数
     * @author MyBatisX Generator
     */
    int updateSelectiveByPk(@Param("record") T record);

    /**
     * 根据id移除记录，软删除，将deleted设置成1
     *
     * @param pk 待插入的数据集合
     * @return 删除的记录数
     * @author MyBatisX Generator
     */
    int removeByPk(@Param("pk") Serializable pk);

    /**
     * 根据id移除记录，批量软删除，将deleted设置成1
     *
     * @param pkList 待插入的数据集合
     * @return 删除的记录数
     * @author MyBatisX Generator
     */
    int removeByPkList(@Param("pkList") ${'Collection<? extends Serializable>'} pkList);

    /**
     * 根据id删除记录
     *
     * @param pk 待插入的数据集合
     * @return 删除的记录数
     * @author MyBatisX Generator
     */
    int deleteByPk(@Param("pk") Serializable pk);

    /**
     * 根据id列表批量删除记录
     *
     * @param pkList 待插入的数据集合
     * @return 删除的记录数
     * @author MyBatisX Generator
     */
    int deleteByPkList(@Param("pkList") ${'Collection<? extends Serializable>'} pkList);

    /**
     * 根据主键，查询记录
     *
     * @param pk 主键
     * @return 更新成功的数量
     * @author MyBatisX Generator
     */
    T get(@Param("pk") Serializable pk);

    /**
     * 查询条件
     *
     * @param query 查询条件
     * @return 查询记录
     * @author MyBatisX Generator
     */
    Collection${'<T>'} list(@Param("query") T query);

    /**
     * 根据指定的条件、字段名查询对应的字段数据。字段名不允许直接使用页面上传入的参数，必须限定在枚举范围内。不能绕过service直接调用该方法。
     *
     * @param query       查询条件
     * @param columnNames 字段名，如果不指定，则查询所有字段
     * @return 查询记录
     * @author MyBatisX Generator
     */
    ${'Collection<T>'} listSpecifiedFields(@Param("query") T query,@Param("fields") ${'Collection<String>'} columnNames);

    /**
     * 将指定的字段重置为默认值
     *
     * @param pkList  主键列表
     * @param columns 字段列表
     * @return 受影响的行数
     * @author MyBatisX Generator
     */
    int resetDefaultVal(@Param("pkList") ${'Collection<Long>'} pkList,@Param("columns") ${'Collection<String>'} columns);
    // endregion MyBatisX Generator

}